import { ApiProperty } from '@nestjs/swagger'
import { Type } from 'class-transformer'
import { IsArray, IsEnum, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator'
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
import { EEnableStatus } from '@/shared/types/globalEnum'

@Entity('home')
export class Home {
  @PrimaryGeneratedColumn('increment')
  @IsNumber()
  homeId: number

  /**
   * 首页标题
   */
  @Column()
  @IsString()
  homeTitle: string

  /**
   * 是否启用
   */
  // boolean 带在 url 上是字符串，一直都是 true，用 transform 拿到也是 true，改用枚举
  // @ApiProperty({
  //   required: false,
  //   enum: EEnableStatus,
  //   default: EEnableStatus.DISABLED,
  // })
  @ApiProperty({ default: EEnableStatus.DISABLED })
  @Column({ default: EEnableStatus.DISABLED })
  @IsEnum(EEnableStatus)
  @IsOptional()
  enableStatus?: EEnableStatus

  /**
   * 首页背景图
   */
  @Column({ type: 'json', nullable: true })
  @IsArray()
  @IsOptional()
  @IsString({ each: true })
  homeBackgroundUrls?: string[]

  /**
   * 首页 Slogan 图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  homeSloganUrl?: string

  /**
   * 新闻资讯轮播图
   */
  @Column({ type: 'json', nullable: true })
  @IsArray()
  @IsOptional()
  @ValidateNested({ each: true }) // 启用嵌套对象的校验
  @Type(() => CarouselItem) // 指定嵌套对象的类型
  homeCarouselUrls?: CarouselItem[]

  /**
   * 新闻资讯右下图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  homeNewsUrl?: string

  /**
   * 新闻资讯边框图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  homeNewsBorderUrl?: string

  /**
   * 新闻资讯边框副图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  homeNewsBorderSideUrl?: string

  /**
   * 游戏特色轮播图
   */
  @Column({ type: 'json', nullable: true })
  @IsArray()
  @IsOptional()
  @ValidateNested({ each: true }) // 启用嵌套对象的校验
  @Type(() => CarouselItem) // 指定嵌套对象的类型
  gameShots?: CarouselItem[]

  /**
   * 首页视频
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  homeVideoUrl?: string

  /**
   * 自定义配置
   */
  @Column({ nullable: true, type: 'longtext' })
  @IsOptional()
  customConfig?: string

  @CreateDateColumn()
  createdAt?: Date

  @UpdateDateColumn()
  updatedAt?: Date
}

export class CarouselItem {
  /**
   * 展示的图片
   */
  @IsString()
  @IsOptional()
  imageUrl?: string

  /**
   * 展示的视频
   */
  @IsString()
  @IsOptional()
  videoUrl?: string

  /**
   * 跳转外链
   */
  @IsString()
  @IsOptional()
  jumpUrl?: string
}
